//
//  main.m
//  OC02实例变量可见度_方法
//
//  Created by dllo on 16/2/25.
//  Copyright © 2016年 APON. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[]) {
#pragma mark - 知识点1: 实例(成员)变量可见度.
/**
 *三种:@public, @protected , @provate
 *默认@protected
 *
 *三种之间的区别:@ public : 本类可以直接访问,子类可直       接访问,其他类可以直接访问
              @protected :本类可以直接访问,子类可以直接访问,其他类不可以直接访问
            @provate  :   本类可以直接访问,子类不可以直接访问,其他类不可以直接访问
 *详见 person.h 文件
 */
#pragma mark - 知识点2: 方法.
/**
 *[接收者(类名或者对象)    消息(方法)] 消息语法
 *接收者是 类名 + 方法(类方法)    [Person alloc]
 *接收者是 对象 - 方法(实例方法) - (void)info[per1 info]
 */
#if 0
#pragma mark - 知识点3: seter, geter 方法.
 /**
  *一个实际变量要有一对 setter, getter 方法
  *setter方法目的,对实际变量进行赋值
  *getter方法目的,对实际变量进行取值
  *
  *详见: person,h 文件
  */
 //创建对象
    Person *per1 = [[Person alloc] init];
    //调用 setter 方法
    [per1 setName:@"zhangsan"];
  //调用 getter 方法
    [per1 name];
    
    NSString *str = [per1 name];
    NSLog(@"str:%@", str);
    //创建per2对象
    Person *per2 = [[Person alloc] init];
    [per2 setName:@"tom"];
    [per2 setName:@"lisi"];
    NSLog(@"%@", [per2 name]);
    //注意:下面的 per3 并没有开辟新的内存空间,只是指针指向了per2内存首地址
    
    Person *per3 = per2;
    NSLog(@"%@", [per3 name]);
#pragma  mark - 知识点4 . 继承.
    /**
     *子类继承父类 所有的实例 变量的和方法
     * OC 中,只有子类父类两层关系
     *OC 中是单向继承
     *继承有传递性
     *
     *Student 类继承于 Person 类, CollegeStudent 类继承与 Student 类
     *详见 Student,CollegeStudent 类文件
     */
 
    //创建 学生对象
    Student *stu1 = [[Student alloc] init];
    //setName方法是从父类继承下来的
    [stu1 setName:@"xiaoming"];
    [stu1 name:@"xiaoming" sex:@"male" age:18];
    [stu1 sayHi];
#pragma mark - 知识点5: 重写父类方法(overwrite).
    /**
     *父类方法无法满足子类需求
     *重写父类方法一般是在父类方法的基础上,添加新的代码段
     *详见 Student.m 文件
     */
    
  //创建一个 Student对象
    Student *student1 = [[Student alloc] init];
    [student1 name:@"wangwu" sex:@"male" age:34];
    [student1 setGrade:80];
    [student1 setClassroomName:@"dls160101"];
    
    //调用 sayHi 方法
    [student1 sayHi];
#pragma mark - 知识点6:重写初始化方法
    /**
     *Person 类重写 父类的 init 方法
     *详见 Person.m 文件
     */
    Person *person1 = [[Person alloc] init];
    [person1 sayHi];
    Student * stu1 = [[Student alloc] init];
    [stu1 sayHi];
#endif
#pragma mark - 知识点7.自定义初始化
    /**
     *通过了一个方法 实现了初始化,同时给某些变量赋值
     *
     *详见 Person.h Person.m 文件
     */
    Person *per1 = [[Person alloc] initWithName:@"tom"];
    [per1 sayHi];
    
    Person *per2 = [[Person alloc] initWithName:@"wocao" sex:@"male" age:25];
    [per2 sayHi];
#pragma mark - 知识点8: 构造器
    /**
     *构造器就是方法 
     * + 方法
     *封装了对象创建和初始化的过程
     *详见 Person 类文件
     *
     */
    /** 创建对象 */
    Person *per6 = [Person person];
    return 0;
}
